package com.mjh.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.HashMap;
import java.util.Map;

/**
 * jwt工具类
 */
public class JWTUtil {

    private static final String SECRET = "fghjkl;dfghjklmmmmm";

    /**
     * 生成jwt
     * @param jsonStr 包含要编码信息的JSON字符串
     * @return 生成的JWT字符串
     */
    public static String createJwt(String jsonStr){
        // 创建一个HashMap来存放JWT的头部信息
        Map<String, Object> headers = new HashMap<>();
        // 添加类型信息
        headers.put("typ", "JWT");
        // 指定签名算法为HS256
        headers.put("alg", "HS256");

        // 使用JWT创建器来构建JWT，并添加头部信息
        // 添加一个名为"data"的声明，其值为传入的JSON字符串
        // 使用HMAC256算法和预定义的密钥SECRET进行签名，最终返回生成的JWT字符串
        return JWT.create()
                .withHeader(headers)
                .withClaim("data", jsonStr)
                .sign(Algorithm.HMAC256(SECRET));
    }
    /**
     * 验证jwt
     * @param jwt 待验证的jwt字符串
     * @return 返回jwt是否有效，true表示有效，false表示无效
     */
    public static Boolean verifyJwt(String jwt){
        try {
            // 使用HMAC256算法和预定义的密钥SECRET构建验证器
            JWT.require(Algorithm.HMAC256(SECRET)).build().verify(jwt);
            // 如果jwt验证成功，返回true
            return true;
        } catch (Exception e) {
            // 如果jwt验证失败，返回false
            return false;
        }
    }
    /**
     * 解析JWT令牌
     * 该方法用于验证JWT令牌的合法性，并从中提取出用户信息
     * @param jwt JWT令牌字符串
     * @return 解析出的用户信息字符串
     * @throws RuntimeException 如果令牌格式不合法或验证失败，抛出运行时异常
     */
    public static String parseJwt(String jwt) {
       try {
           // 创建验证对象，使用HMAC256算法和预设的密钥进行初始化
           JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(SECRET)).build();
           // 验证JWT令牌，并获取解码后的JWT对象
           DecodedJWT decodedJWT = jwtVerifier.verify(jwt);
           // 从解码后的JWT对象中获取名为"data"的声明，并返回其字符串形式的值
           Claim claim = decodedJWT.getClaim("data");
           return claim.asString();
       } catch (IllegalArgumentException e) {
           // 如果JWT令牌为空或格式不正确，抛出运行时异常
           throw new RuntimeException(e);
       } catch (JWTVerificationException e) {
           // 如果JWT令牌验证失败，抛出运行时异常
           throw new RuntimeException(e);
       }
    }

/*
    public static void main(String[] args) {
        String jwt = createJwt("{\"username\":\"admin\",\"password\":\"123456\"}");
        System.out.println(jwt);
        System.out.println(verifyJwt(jwt));
        System.out.println(parseJwt(jwt));

    }
*/

}
